home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / ldbmp08 / ldbmp08s.lzh / LDBMP24.S < prev    next >
Text File  |  1997-09-15  |  19KB  |  987 lines

  1. *****************************************************************
  2. *    フルカラー用                        *
  3. *****************************************************************
  4.     .include    doscall.mac
  5.     .include    iocscall.mac
  6.     .include    myconst.h
  7.  
  8.     .xdef    _Bit24_conv
  9.     .xdef    _Bit24_prt
  10.     .xdef    _Bit24_scroll
  11.     .xdef    _Bit24_rewrite
  12.  
  13.     .xref    _Gxput
  14.  
  15.     .xref    key_chk
  16.     .xref    tenkey_chk
  17.     .xref    cursor_chk
  18.     .xref    mouse_chk
  19.     .xref    scroll_int
  20.     .xref    gr_on0
  21.     .xref    gr_int0
  22.     .xref    gr_off0
  23.     .xref    x_set
  24.     .xref    y_set
  25.     .xref    v_wait
  26.     .xref    inf_change
  27.  
  28.     .xref    line_byte
  29.     .xref    tate
  30.     .xref    yoko
  31.     .xref    x_max
  32.     .xref    y_max
  33.     .xref    x_pos
  34.     .xref    y_pos
  35.     .xref    iro
  36.     .xref    gr_addr
  37.     .xref    d_pat
  38.     .xref    kflg
  39.     .xref    dflg
  40.     .xref    mflg
  41.     .xref    esc_flg
  42.     .xref    next_flg
  43.     .xref    resize_flg
  44.     .xref    scroll_key
  45.     .xref    s_dot24
  46.  
  47. *****************************************************************
  48. *    画像データをコンバート                    *
  49. *****************************************************************
  50. _Bit24_conv:
  51.     bsr    irohen24        *full color変換(最初の1画面)
  52.     rts
  53.  
  54. *****************************************************************
  55. *    表示                            *
  56. *****************************************************************
  57. _Bit24_prt:
  58.     bsr    bit24_prt        *表示(最初の1画面)
  59.     rts
  60.  
  61. *****************************************************************
  62. *    スクロール                        *
  63. *****************************************************************
  64. _Bit24_scroll:
  65.     bsr    scroll            *スクロール
  66.     rts
  67.  
  68. *****************************************************************
  69. *    画面の描き直し                        *
  70. *****************************************************************
  71. _Bit24_rewrite:
  72.     bsr    esc_rewrite
  73.     rts
  74.  
  75. *****************************************************************
  76. *    画像データをコンバート                    *
  77. *****************************************************************
  78. irohen24:
  79.     moveq.l    #0,d0            *変換開始ライン番号
  80.  
  81.     move.w    tate(pc),d1        *変換ライン数
  82.     cmp.w    #512,d1
  83.     bcs    irohen24_
  84.     move.w    #512,d1
  85. irohen24_:
  86.     bsr    conv24
  87.     rts
  88.  
  89. conv24:
  90.     clr.w    bmp_x            *変換元,変換先アドレス取得
  91.     move.w    d0,bmp_y
  92.     bsr    get_bmp_addr
  93.     movea.l    a1,a0
  94.  
  95.     move.w    line_byte(pc),d0    *次のラインへの差分
  96.     add.w    yoko(pc),d0        *(変換先)
  97.     add.w    yoko(pc),d0
  98.     movea.w    d0,a3
  99.  
  100.     movea.l    a3,a2            *次のラインへの差分を計算
  101.     adda.w    yoko(pc),a2        *(変換元)
  102.  
  103.     movea.w    yoko(pc),a4        *横ループ
  104.     move.w    d1,d5            *縦ループ
  105.     subq.w    #1,a4
  106.     subq.w    #1,d5
  107.  
  108.     move.w    #$00f8,d7        *マスクデータ
  109.  
  110.     tst.b    dflg            *ディザもどきあり?
  111.     beq    d_nashi            *指定無し
  112.  
  113.     lea.l    d_pat(pc),a5
  114.     moveq.l    #3,d3
  115.     move.w    bmp_y(pc),d4
  116.  
  117. conv24_1:
  118.     move.w    a4,d6            *横ループ
  119.  
  120.     move.w    d4,d0
  121.     and.w    d3,d0
  122.     add.w    d0,d0
  123.     add.w    d0,d0
  124.     lea.l    0(a5,d0.w),a6
  125.  
  126. conv24_2
  127.     move.w    d6,d0
  128.     and.w    d3,d0
  129.     move.b    0(a6,d0.w),d0
  130.  
  131.     move.b    (a0)+,d1        *B
  132.     add.b    d0,d1
  133.     bcc    conv24_2_
  134.     moveq.l    #31*2,d1
  135.     bra    conv24_3
  136. conv24_2_:
  137.     and.w    d7,d1
  138.     lsr.b    #2,d1
  139.  
  140. conv24_3:
  141.     move.b    (a0)+,d2        *G
  142.     add.b    d0,d2
  143.     bcc    conv24_3_
  144.     ori.w    #$f800,d1
  145.     bra    conv24_4
  146. conv24_3_:
  147.     and.w    d7,d2
  148. *    ror.w    #8,d2
  149.     move.b    d2,-(sp)        *ror.w    #8,d2の代わり
  150.     move.w    (sp)+,d2        *
  151.     clr.b    d2            *
  152.     or.w    d2,d1
  153.  
  154. conv24_4
  155.     move.b    (a0)+,d2        *R
  156.     add.b    d0,d2
  157.     bcc    conv24_4_
  158.     ori.w    #$07c0,d1
  159.     bra    conv24_5
  160. conv24_4_
  161.     and.w    d7,d2
  162.     rol.w    #3,d2
  163.     or.w    d2,d1
  164.  
  165. conv24_5
  166.     move.w    d1,(a1)+
  167.     dbra    d6,conv24_2
  168.     suba.l    a2,a0
  169.     suba.l    a3,a1
  170.     addq.w    #1,d4
  171.     dbra    d5,conv24_1
  172.     rts
  173.  
  174. d_nashi:                *ディザもどきなし
  175.     move.w    a4,d6            *横ループ
  176. d_nashi1
  177.     move.b    (a0)+,d0        *B
  178.     move.b    (a0)+,d1        *G
  179.     move.b    (a0)+,d2        *R
  180.     and.w    d7,d0
  181.     and.w    d7,d1
  182.     and.w    d7,d2
  183.     lsr.w    #2,d0
  184.     lsl.w    #3,d2
  185. *    lsl.w    #8,d1
  186.     move.b    d1,-(sp)        *lsl.w    #8,d1の代わり
  187.     move.w    (sp)+,d1        *
  188.     clr.b    d1            *
  189.     or.w    d1,d0
  190.     or.w    d2,d0            *GRB
  191.     move.w    d0,(a1)+
  192.     dbra.w    d6,d_nashi1
  193.     suba.l    a2,a0
  194.     suba.l    a3,a1
  195.     dbra.w    d5,d_nashi
  196.     rts
  197.  
  198. *****************************************************************
  199. *    画像データを一気に表示する                *
  200. *****************************************************************
  201. bit24_prt:
  202.     move.w    x_pos(pc),gram_x    *表示開始座標
  203.     move.w    y_pos(pc),gram_y
  204.  
  205.     clr.w    bmp_x
  206.     clr.w    bmp_y
  207.  
  208.     move.w    yoko(pc),d0
  209.     cmp.w    #512,d0            *横ドット数が512を超えるか
  210.     bls    bit24_prt1
  211.     move.w    #512,d0
  212. bit24_prt1:
  213.     move.w    d0,bmp_xd
  214.     move.w    d0,x_line
  215.  
  216.     move.w    tate(pc),d0
  217.     cmp.w    #512,d0            *横ドット数が512を超えるか
  218.     bls    bit24_prt2
  219.     move.w    #512,d0
  220. bit24_prt2:
  221.     move.w    d0,bmp_yd
  222.     move.w    d0,y_line
  223.  
  224.     bsr    get_bmp_addr
  225.     bsr    get_gram_addr
  226.  
  227.     tst.b    mflg
  228.     bne    bit24_prt3
  229.     bsr    dma_move        *DMAで表示
  230.     bra    bit24_prt4
  231. bit24_prt3:
  232.     bsr    g24            *MPUで表示
  233. bit24_prt4:
  234.     rts
  235.  
  236. *****************************************************************
  237. *    DMAを使ってグラフィックへ転送する            *
  238. *****************************************************************
  239. dma_move:
  240.     move.w    bmp_yd(pc),d0        *転送サイズ縦
  241.     move.w    bmp_xd(pc),d1        *転送サイズ横
  242.     movea.w    line_byte(pc),a3    *転送元画像の横サイズ
  243.  
  244.     sub.w    #1,d0            *縦ライン-1
  245.  
  246.     move.b    #$FF,CSR2
  247.     move.b    #8,DCR2
  248.  
  249.     btst.l    #0,d1            *横ライン数が偶数か
  250.     beq    dma_move0        *そう
  251.     move.b    #$11,OCR2        *ワード転送
  252.     bra    dma_move1
  253. dma_move0:
  254.     move.b    #$21,OCR2        *ロングワード転送
  255.     lsr.w    #1,d1            *d1を1/2
  256. dma_move1:
  257.     move.b    #%0_000_0101,SCR2
  258.     move.b    #3,CPR2
  259.     clr.b    CCR2
  260.     move.b    #5,DFC2
  261.     move.b    #5,MFC2
  262. dma_move2:
  263.     move.w    d1,MTC2            *転送サイズ
  264.     move.l    a1,MAR2            *転送元
  265.     move.l    a2,DAR2            *転送先
  266.     move.b    #$80,CCR2
  267. dma_move3:
  268.     tst.w    MTC2
  269.     bne    dma_move3
  270.     move.b    #$FF,CSR2
  271.     suba.l    a3,a1            *転送元アドレス更新
  272.     lea.l    1024(a2),a2        *転送先アドレス更新
  273.     dbra.w    d0,dma_move2
  274.  
  275.     rts
  276.  
  277. *****************************************************************
  278. *    スクロール制御                        *
  279. *****************************************************************
  280. scroll:
  281.     moveq.l    #0,d2            *スクロール座標初期化
  282.     moveq.l    #0,d3
  283.     clr.w    x_old
  284.     clr.w    y_old
  285.  
  286.     bsr    down_demo
  287.     bsr    right_demo
  288.  
  289.     tst.b    kflg            *キー入力待ち
  290.     beq    scroll8            *指定無し
  291.  
  292. scroll2:
  293.     bsr    key_chk            *キー入力チェック
  294. *    bsr    mouse_chk        *マウスのキー入力チェック
  295.  
  296.     tst.b    esc_flg            *エスケープ入力
  297.     bne    scroll9
  298.     tst.b    next_flg        *ネクスト入力
  299.     bne    scroll9
  300.     tst.b    resize_flg        *縮小表示
  301.     bne    scroll6
  302.  
  303.     bsr    cursor_chk        *カーソル入力チェック
  304.     bsr    tenkey_chk        *テンキー入力チェック
  305.     bsr    mouse_chk        *マウス入力チェック
  306.     bsr    go_scroll        *スクロール実行
  307.  
  308.     bsr    v_wait            *手抜き
  309.     bra    scroll2            *キー入力に戻る
  310.  
  311. scroll6:                *一画面表示
  312.     bsr    gr_off0
  313.     bsr    gr_int0
  314.     bsr    gr_on0
  315.     bsr    scroll_int
  316.     bsr    resize
  317. scroll6_:
  318.     bsr    key_chk
  319.     bsr    mouse_chk
  320.     tst.b    esc_flg
  321.     bne    scroll9
  322.     tst.b    next_flg
  323.     bne    scroll9
  324.     tst.b    resize_flg
  325.     bne    scroll6_
  326.  
  327. scroll7:                *書き戻し
  328.     bsr    gr_off0
  329.     bsr    gr_int0
  330.     bsr    gr_on0
  331.     bsr    rewrite
  332.     bra    scroll2
  333.  
  334. scroll8:
  335.     bsr    key_chk            *ESCくらいは入力チェック
  336.     bsr    mouse_chk        *マウスのキー入力チェック
  337.  
  338. scroll9:
  339.     rts
  340.  
  341. *****************************************************************
  342. *    一画面表示                        *
  343. *****************************************************************
  344. resize:
  345.     bsr    parm_set
  346.     pea.l    arg_ptr(pc)
  347.     bsr    _Gxput
  348.     addq.l    #4,sp
  349.     rts
  350.  
  351. parm_set:
  352.     lea.l    arg_ptr(pc),a0
  353.  
  354.     bsr    resize_get
  355.     move.w    d0,4(a0)
  356.     move.w    d1,6(a0)
  357.  
  358.     clr.w    gram_x
  359.     clr.w    gram_y
  360.  
  361.     move.w    #512,d2            *X方向のセンタリング
  362.     sub.w    d0,d2
  363.     bmi    parm_set0
  364.     lsr.w    #1,d2
  365.     move.w    d2,gram_x
  366. parm_set0:
  367.     move.w    #512,d3            *Y方向
  368.     sub.w    d1,d3
  369.     bmi    parm_set1
  370.     lsr.w    #1,d3
  371.     move.w    d3,gram_y
  372. parm_set1:
  373.     bsr    get_gram_addr
  374.     move.l    a2,(a0)
  375.     addq.l    #8,a0
  376.  
  377.     clr.w    bmp_x
  378.     clr.w    bmp_y
  379.     bsr    get_bmp_addr
  380.     move.l    a1,(a0)+
  381.  
  382.     move.w    yoko(pc),(a0)+
  383.     move.w    tate(pc),(a0)+
  384.  
  385.     move.w    line_byte(pc),(a0)+
  386.  
  387.     lea.l    work_tbl(pc),a1
  388.     move.l    a1,(a0)+
  389.     rts
  390.  
  391. resize_get:
  392.     move.w    tate(pc),d0        *縦サイズと横サイズを比べる
  393.     cmp.w    yoko(pc),d0
  394.     beq    resize_get2
  395.     bhi    resize_get1
  396.  
  397. resize_get0:
  398.     move.w    #512,d0            *横の方が大きい
  399.     move.w    tate(pc),d1
  400.     mulu.w    #512,d1
  401.     divu.w    yoko(pc),d1
  402.     rts
  403.  
  404. resize_get1:
  405.     move.w    yoko(pc),d0        *縦の方が大きい
  406.     mulu.w    #512,d0
  407.     divu.w    tate(pc),d0
  408.     move.w    #512,d1
  409.     rts
  410.  
  411. resize_get2:
  412.     move.w    #512,d0            *同じ
  413.     move.w    #512,d1
  414.     rts
  415.  
  416. *****************************************************************
  417. *    下方向へ全画面スクロールを行う                *
  418. *****************************************************************
  419. down_demo:
  420.     tst.w    y_max
  421.     beq    down_demo9
  422.     cmp.w    #24,iro
  423.     beq    down_demo1
  424.  
  425.     move.w    s_dot24(pc),-(sp)
  426.     lsr.w    s_dot24
  427. down_demo0:
  428.     bsr    key_chk
  429.     bsr    cursor_chk
  430.     bsr    tenkey_chk
  431.     bsr    mouse_chk
  432.     tst.b    scroll_key
  433.     bne    down_demo8
  434.     tst.b    esc_flg
  435.     bne    down_demo8
  436.     tst.b    next_flg
  437.     bne    down_demo8
  438.  
  439.     bsr    v_wait
  440.     bsr    down
  441.     cmp.w    y_max(pc),d3
  442.     bne    down_demo0
  443.     bra    down_demo8
  444.  
  445.  
  446. down_demo1:
  447.     move.w    s_dot24(pc),-(sp)
  448.     move.w    #1,s_dot24
  449. down_demo2:
  450.     bsr    key_chk
  451.     bsr    mouse_chk
  452.     tst.b    esc_flg
  453.     bne    down_demo8
  454.     tst.b    next_flg
  455.     bne    down_demo8
  456.  
  457.     bsr    demo_conv
  458. *    bsr    v_wait
  459.     bsr    down
  460.     cmp.w    y_max(pc),d3
  461.     bne    down_demo2
  462. down_demo8:
  463.     move.w    (sp)+,s_dot24
  464.  
  465. down_demo9:
  466.     rts
  467.  
  468. demo_conv:                *分割コンバート
  469.     movem.l    d0-d7/a0-a6,-(sp)
  470.     move.w    d3,d0
  471.     add.w    #512,d0
  472.  
  473.     move.w    y_max(pc),d1
  474.     sub.w    d3,d1
  475.     cmp.w    s_dot24(pc),d1
  476.     bls    demo_conv_
  477.     move.w    s_dot24(pc),d1
  478. demo_conv_:
  479.     bsr    conv24
  480.     movem.l    (sp)+,d0-d7/a0-a6
  481.     rts
  482.  
  483. *****************************************************************
  484. *    右方向へ全画面スクロールを行う                *
  485. *****************************************************************
  486. right_demo:
  487.     tst.w    x_max
  488.     beq    right_demo9
  489.     tst.w    d3
  490.     bne    right_demo9
  491. *    move.w    y_max(pc),d0
  492. *    cmp.w    x_max(pc),d0
  493. *    bhi    right_demo9
  494.  
  495.     move.w    s_dot24(pc),-(sp)
  496.     lsr.w    s_dot24
  497. right_demo0:
  498.     bsr    key_chk
  499.     bsr    cursor_chk
  500.     bsr    tenkey_chk
  501.     bsr    mouse_chk
  502.     tst.b    scroll_key
  503.     bne    right_demo8
  504.     tst.b    esc_flg
  505.     bne    right_demo8
  506.     tst.b    next_flg
  507.     bne    right_demo8
  508.  
  509.     bsr    v_wait
  510.     bsr    right
  511.     cmp.w    x_max(pc),d2
  512.     bne    right_demo0
  513. right_demo8:
  514.     move.w    (sp)+,s_dot24
  515. right_demo9:
  516.     rts
  517.  
  518. *****************************************************************
  519. *    スクロール                        *
  520. *****************************************************************
  521. go_scroll:
  522.     moveq.l    #0,d0
  523.     move.b    scroll_key(pc),d0
  524.     add.w    d0,d0
  525.     add.w    d0,d0
  526.     movea.l    scroll_tbl(pc,d0.w),a0
  527.     jsr    (a0)
  528.     rts
  529.  
  530. scroll_tbl:
  531.     .dc.l    null            *0000    入力無し
  532.     .dc.l    left            *0001    左
  533.     .dc.l    up            *0010    上
  534.     .dc.l    left_up            *0011    上左
  535.     .dc.l    right            *0100    右
  536.     .dc.l    null            *0101    右左
  537.     .dc.l    right_up        *0110    右上
  538.     .dc.l    up            *0111    右上左
  539.     .dc.l    down            *1000    下
  540.     .dc.l    left_down        *1001    下左
  541.     .dc.l    null            *1010    下上
  542.     .dc.l    left            *1011    下上左
  543.     .dc.l    right_down        *1100    下右
  544.     .dc.l    down            *1101    下右左
  545.     .dc.l    right            *1110    下右上
  546.     .dc.l    null            *1111    下右上左
  547.     .even
  548.  
  549. *****************************************************************
  550. *    入力無し                        *
  551. *****************************************************************
  552. null:
  553.     rts
  554.  
  555. *****************************************************************
  556. *    右下(手抜き)                        *
  557. *****************************************************************
  558. right_down:
  559.     bsr    right
  560.     bsr    down
  561.     rts
  562.  
  563. *****************************************************************
  564. *    左下(手抜き)                        *
  565. *****************************************************************
  566. left_down:
  567.     bsr    left
  568.     bsr    down
  569.     rts
  570.  
  571. *****************************************************************
  572. *    右上(手抜き)                        *
  573. *****************************************************************
  574. right_up:
  575.     bsr    right
  576.     bsr    up
  577.     rts
  578.  
  579. *****************************************************************
  580. *    左上(手抜き)                        *
  581. *****************************************************************
  582. left_up:
  583.     bsr    left
  584.     bsr    up
  585.     rts
  586.  
  587. *****************************************************************
  588. *    左へ                            *
  589. *****************************************************************
  590. left:
  591.     sub.w    s_dot24(pc),d2
  592.     tst.w    d2
  593.     bpl    left1
  594.     clr.w    d2
  595. left1:
  596.     bsr    x_set
  597.  
  598.     move.w    x_old(pc),d5        *何ドットずらすか
  599.     sub.w    d2,d5
  600.     beq    left9
  601.  
  602.     move.w    d2,d0            *表示開始X座標
  603.     add.w    x_pos(pc),d0
  604.     and.w    #$1ff,d0
  605.     move.w    d0,gram_x
  606.  
  607.     move.w    y_old(pc),d0        *表示開始Y座標
  608.     add.w    y_pos(pc),d0
  609.     and.w    #$1ff,d0
  610.     move.w    d0,gram_y
  611.  
  612.     move.w    d2,bmp_x
  613.     move.w    d5,bmp_xd
  614.     move.w    y_old(pc),bmp_y
  615.     move.w    y_line(pc),bmp_yd
  616.  
  617.     bsr    get_bmp_addr        *表示
  618.     bsr    get_gram_addr
  619.     bsr    g24
  620.  
  621.     move.w    d2,x_old
  622. left9:
  623.     rts
  624.  
  625. *****************************************************************
  626. *    上へ                            *
  627. *****************************************************************
  628. up:
  629.     sub.w    s_dot24(pc),d3
  630.     tst.w    d3
  631.     bpl    up1
  632.     clr.w    d3
  633. up1:
  634.     move.w    y_old(pc),d6        *何ドットずらすか
  635.     sub.w    d3,d6
  636.     beq    up9
  637.  
  638.     move.w    x_old(pc),d0        *表示開始X座標
  639.     add.w    x_pos(pc),d0
  640.     and.w    #$1ff,d0
  641.     move.w    d0,gram_x
  642.  
  643.     move.w    d3,d0            *表示開始Y座標
  644.     add.w    y_pos(pc),d0
  645.     and.w    #$1ff,d0
  646.     move.w    d0,gram_y
  647.  
  648.     move.w    x_old(pc),bmp_x
  649.     move.w    x_line(pc),bmp_xd
  650.     move.w    d3,bmp_y
  651.     move.w    d6,bmp_yd
  652.  
  653.     bsr    get_bmp_addr
  654.     bsr    get_gram_addr
  655.     bsr    g24
  656.  
  657.     bsr    y_set
  658.  
  659.     move.w    d3,y_old
  660. up9:
  661.     rts
  662.  
  663. *****************************************************************
  664. *    右へ                            *
  665. *****************************************************************
  666. right:
  667.     add.w    s_dot24(pc),d2
  668.     cmp.w    x_max(pc),d2
  669.     bls    right1
  670.     move.w    x_max(pc),d2
  671. right1:
  672.     bsr    x_set
  673.  
  674.     move.w    d2,d5            *何ドットずらすか
  675.     sub.w    x_old(pc),d5
  676.     beq    right9
  677.  
  678.     move.w    x_old(pc),d0        *表示開始X座標
  679.     add.w    x_pos(pc),d0
  680.     add.w    #512,d0
  681.     and.w    #$1ff,d0
  682.     move.w    d0,gram_x
  683.  
  684.     move.w    y_old(pc),d0        *表示開始Y座標
  685.     add.w    y_pos(pc),d0
  686.     and.w    #$1ff,d0
  687.     move.w    d0,gram_y
  688.  
  689.     move.w    x_old(pc),bmp_x
  690.     add.w    #512,bmp_x
  691.     move.w    d5,bmp_xd
  692.     move.w    y_old(pc),bmp_y
  693.     move.w    y_line(pc),bmp_yd
  694.  
  695.     bsr    get_bmp_addr        *表示
  696.     bsr    get_gram_addr
  697.     bsr    g24
  698.  
  699.     move.w    d2,x_old
  700. right9:
  701.     rts
  702.  
  703. *****************************************************************
  704. *    下へ                            *
  705. *****************************************************************
  706. down:
  707.     add.w    s_dot24(pc),d3
  708.     cmp.w    y_max(pc),d3
  709.     bls    down1
  710.     move.w    y_max(pc),d3
  711. down1:
  712.     bsr    y_set
  713.  
  714.     move.w    d3,d6            *何ドットずらすか
  715.     sub.w    y_old(pc),d6
  716.     beq    down9
  717.  
  718.     move.w    x_old(pc),d0        *表示開始X座標
  719.     add.w    x_pos(pc),d0
  720.     and.w    #$1ff,d0
  721.     move.w    d0,gram_x
  722.  
  723.     move.w    y_old(pc),d0        *表示開始Y座標
  724.     add.w    y_pos(pc),d0
  725.     and.w    #$1ff,d0
  726.     move.w    d0,gram_y
  727.  
  728.     move.w    x_old(pc),bmp_x
  729.     move.w    x_line(pc),bmp_xd
  730.     move.w    y_old(pc),bmp_y
  731.     add.w    #512,bmp_y
  732.     move.w    d6,bmp_yd
  733.  
  734.     bsr    get_bmp_addr        *表示
  735.     bsr    get_gram_addr
  736.     bsr    g24
  737.  
  738.     move.w    d3,y_old
  739. down9:
  740.     rts
  741.  
  742. *****************************************************************
  743. *    一画面表示後の描き戻し                    *
  744. *****************************************************************
  745. rewrite:
  746.     move.w    x_old(pc),d2
  747.     move.w    y_old(pc),d3
  748.  
  749.     move.w    d2,d0            *表示開始X座標
  750.     add.w    x_pos(pc),d0
  751.     and.w    #$1ff,d0
  752.     move.w    d0,gram_x
  753.  
  754.     move.w    d3,d0            *表示開始Y座標
  755.     add.w    y_pos(pc),d0
  756.     and.w    #$1ff,d0
  757.     move.w    d0,gram_y
  758.  
  759.     move.w    d2,bmp_x
  760.     move.w    x_line(pc),bmp_xd
  761.     move.w    d3,bmp_y
  762.     move.w    y_line(pc),bmp_yd
  763.  
  764.     bsr    get_bmp_addr        *表示
  765.     bsr    get_gram_addr
  766.     bsr    x_set
  767.     bsr    y_set
  768.     bsr    g24
  769.     rts
  770.  
  771. *****************************************************************
  772. *    終了時の描き戻し                    *
  773. *****************************************************************
  774. esc_rewrite:
  775.     move.w    x_pos(pc),gram_x    *表示開始X座標
  776.     move.w    y_pos(pc),gram_y    *表示開始Y座標
  777.  
  778.     move.w    d2,bmp_x
  779.     move.w    x_line(pc),bmp_xd
  780.     move.w    d3,bmp_y
  781.     move.w    y_line(pc),bmp_yd
  782.  
  783.     clr.w    d2
  784.     clr.w    d3
  785.  
  786.     bsr    get_bmp_addr        *表示
  787.     bsr    get_gram_addr
  788.     bsr    x_set
  789.     bsr    y_set
  790.     bsr    g24
  791.  
  792.     rts
  793.  
  794. *****************************************************************
  795. *    スクロール分のグラフィックを表示する            *
  796. *    gram_x, gram_y  表示先座標(GRAM)            *
  797. *    bmp_x,  bmp_y   表示元座標(BMP)                *
  798. *    bmp_xd, bmp_yd  ドット数                *
  799. *****************************************************************
  800. g24:
  801.     movem.l    d5-d6,-(sp)
  802.     move.w    bmp_xd(pc),d0        *横ドット数
  803.     move.w    bmp_yd(pc),d7        *縦ドット数
  804.  
  805.     move.w    line_byte(pc),d4    *次のラインへのバイト数
  806.     add.w    d0,d4            *(転送元)
  807.     add.w    d0,d4
  808.  
  809.     move.w    #512,d5            *表示データの1ライン下までの差分
  810.     sub.w    d0,d5            *(表示先)
  811.     add.w    d5,d5
  812.  
  813.     move.w    gram_x(pc),d6
  814.     add.w    bmp_xd(pc),d6
  815.     cmp.w    #512,d6
  816.     bhi    g24_2            *左右2回に分けて表示
  817.  
  818.     cmp.w    #1,d0            *表示ライン=横1ドット
  819.     beq    g24_1
  820.  
  821.     cmp.w    #8,d0            *表示ライン=横8ドット
  822.     beq    g24_8
  823.  
  824.     btst.l    #0,d0
  825.     beq    g24_g            *表示ライン=偶数
  826.     bra    g24_k            *表示ライン=奇数
  827.  
  828. g24_1:
  829.     subq.w    #1,d7            *dbraのため縦-1
  830. g24_11:
  831.     move.w    (a1)+,(a2)+
  832.     suba.w    d4,a1            *変換元アドレス更新
  833.     adda.w    d5,a2            *表示先アドレス更新
  834.     cmpa.l    a3,a2
  835.     bcs    g24_13
  836.     suba.l    #GRAM_MAX-GRAM,a2
  837. g24_13:
  838.     dbra    d7,g24_11
  839.     bra    g24_end
  840.  
  841. g24_8:
  842.     subq.w    #1,d7            *dbraのため縦-1
  843. g24_81:
  844.     move.l    (a1)+,(a2)+
  845.     move.l    (a1)+,(a2)+
  846.     move.l    (a1)+,(a2)+
  847.     move.l    (a1)+,(a2)+
  848.     suba.w    d4,a1            *変換元アドレス更新
  849.     adda.w    d5,a2            *表示先アドレス更新
  850.     cmpa.l    a3,a2
  851.     bcs    g24_83
  852.     suba.l    #GRAM_MAX-GRAM,a2
  853. g24_83:
  854.     dbra    d7,g24_81
  855.     bra    g24_end
  856.  
  857. g24_g:
  858.     lsr.w    #1,d0            *1/2
  859.     subq.w    #1,d0            *dbraのため-1
  860.     subq.w    #1,d7            *dbraのため-1
  861. g24_g1:
  862.     move.w    d0,d1
  863. g24_g2:
  864.     move.l    (a1)+,(a2)+
  865.     dbra    d1,g24_g2
  866.     suba.w    d4,a1            *変換元アドレス更新
  867.     adda.w    d5,a2            *表示先アドレス更新
  868.     cmpa.l    a3,a2
  869.     bcs    g24_g3
  870.     suba.l    #GRAM_MAX-GRAM,a2
  871. g24_g3:
  872.     dbra    d7,g24_g1
  873.     bra    g24_end
  874.  
  875. g24_k:
  876.     lsr.w    #1,d0            *1/2
  877.     subq.w    #1,d0            *dbraのため-1
  878.     subq.w    #1,d7            *dbraのため-1
  879. g24_k1:
  880.     move.w    d0,d1
  881. g24_k2:
  882.     move.l    (a1)+,(a2)+
  883.     dbra    d1,g24_k2
  884.     move.w    (a1)+,(a2)+
  885.     suba.w    d4,a1            *変換元アドレス更新
  886.     adda.w    d5,a2            *表示先アドレス更新
  887.     cmpa.l    a3,a2
  888.     bcs    g24_k3
  889.     suba.l    #GRAM_MAX-GRAM,a2
  890. g24_k3:
  891.     dbra    d7,g24_k1
  892.     bra    g24_end
  893.  
  894. g24_2:                    *左右2回に分けて表示
  895.     add.w    #1024,d5        *1ライン下までの差分を補正
  896.  
  897.     move.w    #512,d0            *横ドット1
  898.     sub.w    gram_x(pc),d0
  899.     move.w    bmp_xd(pc),d6        *横ドット2
  900.     sub.w    d0,d6
  901.  
  902.     subq.w    #1,d0            *dbraのため-1
  903.     subq.w    #1,d6            *dbraのため-1
  904.     subq.w    #1,d7            *dbraのため-1
  905. g24_21:
  906.     move.w    d0,d1            *右側
  907. g24_22:
  908.     move.w    (a1)+,(a2)+
  909.     dbra    d1,g24_22
  910. g24_23:
  911.     move.w    d6,d1            *左側
  912.     lea.l    -1024(a2),a2
  913. g24_24:
  914.     move.w    (a1)+,(a2)+
  915.     dbra    d1,g24_24
  916.  
  917.     suba.w    d4,a1            *変換元アドレス更新
  918.     adda.w    d5,a2            *表示先アドレス更新
  919.     cmpa.l    a3,a2
  920.     bcs    g24_25
  921.     suba.l    #GRAM_MAX-GRAM,a2
  922. g24_25:
  923.     dbra    d7,g24_21
  924.  
  925. g24_end:
  926.     movem.l    (sp)+,d5-d6
  927.     rts
  928.  
  929. *****************************************************************
  930. *    BMPデータのアドレスを取得(a1)                *
  931. *****************************************************************
  932. get_bmp_addr:
  933.     move.w    tate(pc),d0        *(tate-1-bmp_y)*line_byte+bmp_x*2+gr_addr
  934.     subq.w    #1,d0
  935.     sub.w    bmp_y(pc),d0
  936.     mulu.w    line_byte(pc),d0
  937.     add.l    gr_addr(pc),d0
  938.     movea.l    d0,a1
  939.     adda.w    bmp_x(pc),a1
  940.     adda.w    bmp_x(pc),a1
  941.     rts
  942.  
  943. *****************************************************************
  944. *    GRAMのアドレスを取得(a2)                *
  945. *****************************************************************
  946. get_gram_addr:
  947.     move.w    gram_x(pc),d0        *表示先画像アドレス
  948.     move.w    gram_y(pc),d1
  949.     swap.w    d1
  950.     clr.w    d1
  951.     ror.l    #6,d1
  952.     add.w    d0,d0
  953.     add.w    d0,d1
  954.     movea.l    d1,a2
  955.     adda.l    #GRAM,a2
  956.  
  957.     movea.l    #GRAM_MAX,a3        *GRAM_MAX
  958.     rts
  959.  
  960. *****************************************************************
  961. *    ワークエリア                        *
  962. *****************************************************************
  963.     .bss
  964.     .even
  965.  
  966. gram_x    .ds.w    1            *表示する座標(GRAM)
  967. gram_y    .ds.w    1
  968.  
  969. bmp_x    .ds.w    1            *表示する座標(BMP)
  970. bmp_y    .ds.w    1
  971. bmp_xd    .ds.w    1            *表示するドット数
  972. bmp_yd    .ds.w    1
  973.  
  974. x_line:
  975.     .ds.w    1            *横ドット数
  976. y_line:
  977.     .ds.w    1            *縦ドット数
  978. x_old:
  979.     .ds.w    1            *前回のX座標
  980. y_old:
  981.     .ds.w    1            *前回のY座標
  982. arg_ptr:
  983.     .ds.b    4+2*2+4+2*2+2+4
  984. work_tbl:
  985.     .ds.b    1024
  986.     .even
  987.